% Practica 1 - Apartado 2 - Caso 1 vectores unidimensionales

close all;
clear all;
clc;
format long;

a = 2;
b = rand;

% Senal continua:
%Ejemplo 1:
%x = -3:0.05:3;
%senal = sin(x) - cos(2.*x); % Senal de entrada
%senal_salida = 2.5*senal; % Combinacion lineal de la senal de entrada

%Ejemplo 2
%x = 1:0.005:3;
%senal = sin(sin(x).*x*10) + sin(tan(3.2./x));
%senal_salida = a*senal + b;

%Ejemplo 3 peta -> no muestra senal de salida
%x1 = -5:0.005:0;
%x2 = 0.1:0.005:4;
%x=[x1 x2];
%senal = [x1.^2+cos(3*x1)./2+sin(x1.^2) sin(4*x2.^2)+(3*x2.^2)];
%senal_salida = 2*senal+2;

%Ejemplo 4
%x= 0:0.5:3;
%senal = sin (x);
%senal_salida = a*senal + b;

%Ejemplo 5 
%x = 0:0.005:4;
%senal= sin(2.*x)-cos(3.*x);
%senal_salida = 0.5*senal;

% Ejemplo 6
%x1 = -2:0.01:-1;
%x2 = -1:0.01:1;
%x3 = 1:0.01:2;
%x = [x1 x2 x3];
%senal = [x1.^2 + cos(2*x1) tan(x2.^2) exp(x3)];
%senal_salida = 2*senal + 4;      %Funciones definidas a trozos fallan

%Ejemplo 7
%x1 = -3:0.01:0;
%x2 = 0:0.01:3;
%x = [x1 x2];
%senal = [(4*x1) (-3*x2.^2)];
%senal_salida = 2*senal;

%Ejemplo 8
x = -3*pi:0.005:3*pi;
senal = cos(3*x.^2) + sin(0.5*x);
senal_salida = a*senal + b;

v = maxlinlr(x)'; % velocidad de aprendizaje

ruido = senal;
for i = 1:length(x),
    ruido(i) = senal(i) + 0.05*rand;
end

PR1 = [min(x) max(x)];
S1 = 1;
ID1 = 0;
LR1 = v;
red1 = NEWLIN(PR1,S1,ID1,LR1);
    
% Inicializo los pesos:
peso(1,1) = rand;   
red1.iw{1} = [peso(1,1)]; 
red1.trainParam.goal = 0.0001;
red1.trainParam.epochs = 1000;

% Patrones:
for i = 1:length(x),
    p(1,i) = senal(i);
    s(i) = senal_salida(i);
end
    
% Entrenamiento de la red:
[red1,TR,Y,E] = train(red1,p,s);
Salida = Y;
Error = E;
peso = red1.iw{1,1};
w1 = peso(1);
bias = red1.b{1};
    
%LP.lr = v; 
%for i = 1:length(x),
%    patron = [senal(i)];
%    deseada(i) = senal_salida(i);
%    obtenida(i) = senal(i)*peso(1,i);
%    error(i) = deseada(i) - obtenida(i);
%    Error(i) = mse(error(i));
%    dw = learnwh(peso(1,i),patron,[],[],[],deseada(i),error(i),[],[],[],LP,[]);
%    w1 = peso(1,i);
%    peso(1,(i+1)) = w1 + dw(1);
%end

%for i = 1:length(x),
%    Salida(i) = senal(i)*w1;
%end
    
for i = 1:length(x)
    obtenida_ruido(i) = ruido(i)*w1 + bias;
end
    
% Representaciones Graficas:
    
%figure(3);
%plot(senal,'r');
%hold on;
%plot(senal_salida,'b');
%hold off;
%legend('Senal de entrada','Senal de salida');

%figure(4);
%plot(Salida,'b');
%hold on;
%plot(senal_salida,'r--');
%legend('Senal obtenida','Senal deseada');
%hold off;

%figure(5);
%plot(Error,'g'); % Error devuelto por train

%figure(6);
%plot(obtenida_ruido,'r');
%hold on;
%plot(Salida,'b--');
%legend('Obtenida con ruido','Senal de salida');
%hold off;

figure(3);
subplot(211);
plot(senal,'r');
hold on;
plot(senal_salida,'b');
hold off;
legend('Senal de entrada','Senal de salida');
grid;
subplot(212);
plot(Salida,'b');
hold on;
plot(senal_salida,'r--');
legend('Senal obtenida','Senal deseada');
hold off;
grid;
figure(4)
subplot(211);
plot(obtenida_ruido,'r');
hold on;
plot(Salida,'b--');
legend('Obtenida con ruido','Senal de salida');
hold off;
grid;
subplot(212);
plot(Error,'g');
grid; %Error devuelto por train